import axios from 'axios';
import { Message } from 'element-ui';
import store from '../store';
import { debounce } from '../utils/utils';

const authError = debounce((message) => {
  Message({
    message,
    type: 'error',
  });
}, 1000);

const authSuccess = debounce((message) => {
  Message({
    message,
    type: 'success',
  });
}, 1000);

axios.defaults.timeout = 30000; // 超时时间
axios.defaults.retry = 2; // 超时后，重新请求次数
axios.defaults.retryDelay = 1000; // 超时后，重新请求间隔时间
axios.defaults.headers.post['Content-Type'] = 'application/json';

// http request 拦截器
axios.interceptors.request.use(
  (config) => {
    if (localStorage.token) {
      config.headers['Menu-ID'] = store.state.app.menuId;
      // config.headers.Authorization = localStorage.getItem('token');
      // config.headers.appName = window.$Vcli.appName;
    }
    // if (config.method === 'post') {
    //   var channelNo = new Date().getTime()
    //   if (!config.data.sysHead) {
    //     config.data.sysHead = {
    //       channelSeqNo: channelNo,
    //       reference: '10000004',
    //       branchId: '1004',
    //       seqNo: '10000004',
    //       tranDate: '20200318',
    //       userId: 'admin',
    //       tranStartTime: '20200324',
    //       tranEndTime: '20200324',
    //       sourceType: 'GV',
    //       systemId: 'GV',
    //       statue: '1'
    //     }
    //   } else {
    //     config.data.sysHead.channelSeqNo = channelNo
    //     config.data.sysHead.branchId = localStorage.getItem('branch')
    //     config.data.sysHead.seqNo = channelNo
    //     config.data.sysHead.tranDate = localStorage.getItem('runDate')
    //     config.data.sysHead.userId = localStorage.getItem('userName')
    //     if (localStorage.getItem('systemDef')) {
    //       // 渠道代号
    //       config.data.sysHead.sourceType = JSON.parse(localStorage.getItem('systemDef')).sourceType
    //       config.data.sysHead.sourceModule = JSON.parse(localStorage.getItem('systemDef')).sourceModule
    //       // 系统代号
    //       config.data.sysHead.systemId = JSON.parse(localStorage.getItem('systemDef')).systemId
    //     } else {
    //       config.data.sysHead.sourceType = 'GL'
    //       config.data.sysHead.sourceModule = 'GL'
    //       // 系统代号
    //       config.data.sysHead.systemId = 'GLS'
    //     }
    //     // 对所有的1000，1200，1300交易进行记录操作
    //     if ((config.data.sysHead.messageType === '1000' || config.data.sysHead.messageType === '1200' || config.data.sysHead.messageType === '1300') & !config.data.transRecord) {
    //       config.data.transRecord = true
    //     }
    //   }
    // }
    if (config.data && config.data.transRecord) {
      const _data = Object.assign(config.data.result ? config.data.result : {}, config.data.sysHead);
      const params = {};
      for (const key in _data) {
        if (_data.hasOwnProperty(key)) {
          if (TRANSACTION_KEYS.includes(key)) {
            params[key] = _data[key];
          }
        }
      }
      if (config.data.result) {
        delete config.data.result;
      }
      if (config.data.transRecord) {
        delete config.data.transRecord;
      }
    }
    return config;
  },
  (error) => Promise.reject(error),
);

// http response 拦截器
axios.interceptors.response.use(
  (response) =>  {
    if (response.data['sysHead'] !== undefined) {
      if (response.data['sysHead']['ret'] !== undefined) {
        if(response.data.sysHead.ret[0].retCode === '000000') {
          response.data.code = '0000'
          response.data.message = '操作成功'
        } else {
          response.data.code = response.data.sysHead.ret[0].retCode
          response.data.message = response.data.sysHead.ret[0].retMsg
        }
      }
    }
    return response.data
  },
  (error) => {
    const { config } = error;
    // 超时处理
    if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
      if (!config || !config.retry) return Promise.reject(error);
      // 设置变量来跟踪重试次数
      config._retryCount = config._retryCount || 0;
      // 判断是否已经达到最大重新请求次数
      if (config._retryCount >= config.retry) {
        authError('服务器超时！');
        return Promise.reject(error);
      }
      config._retryCount += 1;
      // eslint-disable-next-line
      const backoff = new Promise(reslove => {
        setTimeout(() => {
          reslove();
        }, config.retryDelay || 1);
      });
      delete config.baseURL;
      return backoff.then(() => axios(config));
    }
    if (error.response) {
      // 根据系统响应状态码，统一做不同错误的处理
      switch (error.response.status) {
        case 200:
          authSuccess((error.response && error.response.data && error.response.data.error_description) || '查询左侧树成功');
          localStorage.clear();
          break;
        case 500:
          authError((error.response && error.response.data && error.response.data.message) || '服务器错误');
          break;
        // default:
        //   authError((error.response && error.response.data && error.response.data.message) || '系统错误');
        //   break;
      }
    }
    return Promise.reject(error && error.response);
  },
);

export default axios;
